<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Programmation réactive</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Programmation_r%C3%A9active"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Programmation_réactive rootpage-Programmation_réactive skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Programmation réactive</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr"><p>En informatique, la <b>programmation réactive</b> est un paradigme de <a href="Programmation" class="mw-redirect" title="Programmation">programmation</a> visant à conserver une cohérence d'ensemble en propageant les modifications d'une <i>source réactive</i> (modification d'une variable, entrée utilisateur, etc.) aux éléments dépendants de cette source.
</p>
<div class="mw-heading mw-heading2"><h2 id="Historique">Historique</h2></div>
<p>La programmation réactive est née à partir du patron de conception <a href="Observateur_(patron_de_conception)" title="Observateur (patron de conception)">observateur</a> afin de corriger ses défauts<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-0" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>, parmi lesquels :
</p>
<dl><dt><a href="Encapsulation_(programmation)" title="Encapsulation (programmation)">Encapsulation</a></dt>
<dd>Le patron de conception <a href="Observateur_(patron_de_conception)" title="Observateur (patron de conception)">Observateur</a> est souvent utilisé pour faire des machines à états. Malheureusement, les états sont souvent sauvegardés dans des variables qui doivent être visibles par tous les observateurs<sup id="cite_ref-Ingo_MaierMartin_Odersky1_2-0" class="reference"><a href="#cite_note-Ingo_MaierMartin_Odersky1-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>.</dd>
<dt>Manque de composabilité</dt>
<dd>Le code qui en résulte n'est pas assez composable. Par exemple, il n'est pas toujours facile d'ajouter ou de supprimer un <a href="Glisser_d%C3%A9poser" class="mw-redirect" title="Glisser déposer">glisser-déposer (drag and drop)</a> à un élément lorsqu'il y a beaucoup d'observateurs qui ont plus ou moins la même fonctionnalité<sup id="cite_ref-Ingo_MaierMartin_Odersky1_2-1" class="reference"><a href="#cite_note-Ingo_MaierMartin_Odersky1-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>.</dd>
<dt>Lisibilité réduite</dt>
<dd>Il est difficile de faire correspondre les entrées aux sorties<sup id="cite_ref-Guido_SalvaneschiMira_Mezini20131_3-0" class="reference"><a href="#cite_note-Guido_SalvaneschiMira_Mezini20131-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> (<a href="Syndrome_du_plat_de_spaghettis" title="Syndrome du plat de spaghettis">syndrome du plat de spaghettis</a>).</dd>
<dt>Gestion des ressources</dt>
<dd>La vie d'un observateur doit être spécifiée explicitement, ce qui peut provoquer une mauvaise gestion des ressources. Dans certains cas, pour des soucis de performances, il est utile de n'activer un observateur qu'au moment où nous en avons besoin. Exemple : si l'utilisateur n'utilise pas le <a href="Glisser_d%C3%A9poser" class="mw-redirect" title="Glisser déposer">glisser-déposer (drag and drop)</a>, il est alors inutile de récupérer les coordonnées de la souris sans cesse<sup id="cite_ref-Ingo_MaierTiark_RompfMartin_Odersky2_4-0" class="reference"><a href="#cite_note-Ingo_MaierTiark_RompfMartin_Odersky2-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>.</dd>
<dt>Séparation des préoccupations</dt>
<dd>Il faut diviser le code de sorte que chaque méthode ait sa propre fonctionnalité, et que celle-ci soit unique, autrement dit, il faut respecter le SRP (<i>Single Responsibility Principle</i>). Exemple : Dans le cas d'une application qui sert à dessiner avec la souris, les observateurs de l'application ne vont pas que construire le chemin de la souris mais vont aussi appeler des méthodes pour l'afficher, ce qui n'est pas une bonne pratique<sup id="cite_ref-Ingo_MaierMartin_Odersky2_5-0" class="reference"><a href="#cite_note-Ingo_MaierMartin_Odersky2-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>.</dd>
<dt>Cohérence des données</dt>
<dd>Avec le patron de conception <a href="Observateur_(patron_de_conception)" title="Observateur (patron de conception)">Observateur</a>, il n'y a aucune garantie que les données restent cohérentes<sup id="cite_ref-Ingo_MaierMartin_Odersky2_5-1" class="reference"><a href="#cite_note-Ingo_MaierMartin_Odersky2-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>.</dd>
<dt>Uniformité</dt>
<dd>Le fait que la mise en place des différents observateurs est effectuée par plusieurs méthodes, diminue l'uniformité du code<sup id="cite_ref-Ingo_MaierTiark_RompfMartin_Odersky2_4-1" class="reference"><a href="#cite_note-Ingo_MaierTiark_RompfMartin_Odersky2-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>.</dd></dl>
<div class="mw-heading mw-heading2"><h2 id="Importance_de_la_programmation_réactive"><span id="Importance_de_la_programmation_r.C3.A9active"></span>Importance de la programmation réactive</h2></div>
<p>La plupart des applications contemporaines sont réactives, c'est-à-dire qu'elles répondent, en calculant, à des événements qui leur parviennent<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-1" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.
</p><p>Cela permet aux utilisateurs d'avoir une meilleure interaction avec le système, une réponse beaucoup plus rapidement et donc une satisfaction<sup id="cite_ref-Guido_SalvaneschiMira_Mezini20131_3-1" class="reference"><a href="#cite_note-Guido_SalvaneschiMira_Mezini20131-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>.
</p><p>La réactivité est désormais présente partout, et principalement dans les interfaces graphiques<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-2" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.
</p><p>Les applications réactives sont importantes aujourd'hui car elles doivent être :
</p>
<dl><dt>Disponibles</dt>
<dd>le système doit répondre rapidement quoi qu'il arrive.</dd>
<dt>Résilientes</dt>
<dd>le système doit toujours rester disponible, même en cas d'erreur.</dd>
<dt>Souples</dt>
<dd>le système doit continuer à vivre même s'il est surchargé.</dd>
<dt>Orientées messages</dt>
<dd>le système utilise des messages asynchrones.</dd></dl>
<p>Ce qui correspond aux exigences des utilisateurs d'aujourd'hui<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Fonctionnement">Fonctionnement</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Description_générale"><span id="Description_g.C3.A9n.C3.A9rale"></span>Description générale</h3></div>
<p>Chaque variable est avant tout initialisée lors de l'analyse des expressions et les dépendances entre les variables sont enregistrées, de sorte que, dès qu'une variable subit une mise à jour (événement), alors toutes les variables qui en dépendent, subissent elles aussi une mise à jour de leur valeur. Par la suite, elles peuvent, elles aussi, déclencher la mise à jour d'autres variables et ainsi de suite<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-3" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.
</p><p>La programmation réactive fait alors en sorte que chaque expression soit correcte à tout instant<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-4" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.
</p><p>
Par exemple :</p><div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre><span></span>a := 50
b := a + 22
c := a + 6
d := b + c
</pre></div><p>Après avoir analysé les expressions, voici les résultats :
</p><table class="wikitable">
<tbody><tr>
<th>a
</th>
<th>b
</th>
<th>c
</th>
<th>d
</th></tr>
<tr>
<td>50
</td>
<td>72
</td>
<td>56
</td>
<td>128
</td></tr></tbody></table>
<p>Et voici les dépendances :
</p>
<table class="wikitable">
<tbody><tr>
<th>a
</th>
<th>b
</th>
<th>c
</th>
<th>d
</th></tr>
<tr>
<td>
</td>
<td>a
</td>
<td>a
</td>
<td>b , c
</td></tr></tbody></table>
<p>Supposons désormais que la valeur de <b>a</b> change et passe à 10.
</p><p>En programmation réactive, puisque <b>b</b> et <b>c</b> dépendent de <b>a</b>, alors <b>b</b> et <b>c</b> vont être automatiquement mises à jour.
</p>
<table class="wikitable">
<tbody><tr>
<th>a
</th>
<th>b
</th>
<th>c
</th>
<th>d
</th></tr>
<tr>
<td>10
</td>
<td>32
</td>
<td>16
</td>
<td>128
</td></tr></tbody></table>
<p>De la même manière, b et c viennent d'être mis à jour. Par conséquent, puisque <b>d</b> dépend de <b>b</b> et <b>c</b>, alors d subira lui aussi une mise à jour.
</p>
<table class="wikitable">
<tbody><tr>
<th>a
</th>
<th>b
</th>
<th>c
</th>
<th>d
</th></tr>
<tr>
<td>10
</td>
<td>32
</td>
<td>16
</td>
<td>48
</td></tr></tbody></table>
<p>Il suffit d'une seule modification de valeur pour que la variable se mette à jour.
</p>
<div class="mw-heading mw-heading3"><h3 id="Concepts">Concepts</h3></div>
<p>La programmation réactive est basée sur des concepts comme des variations des valeurs dans le temps, des flots d’événements pour modéliser les mises à jour discrètes, des suivis de dépendances, et des propagations automatiques du changement<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-5" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Valeurs_qui_varient_dans_le_temps">Valeurs qui varient dans le temps</h4></div>
<p>À tout instant <b>t</b> de l'exécution du programme, toutes les expressions du programme doivent rester correctes. Par conséquent, les valeurs des variables évoluent dans le temps au fur et à mesure de l'exécution du programme de manière automatique et discrète<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-6" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Flots_d'événements"><span id="Flots_d.27.C3.A9v.C3.A9nements"></span>Flots d'événements</h4></div>
<p>Lorsqu'une variable change de valeur, toutes les variables qui dépendent d'elle sont mises à jour, ce qui nécessite un événement / message.
</p><p>Il est important en programmation réactive d'écouter tous les événements qui peuvent survenir.
</p>
<div class="mw-heading mw-heading4"><h4 id="Suivis_de_dépendances"><span id="Suivis_de_d.C3.A9pendances"></span>Suivis de dépendances</h4></div>
<p>Les dépendances entre les variables, directes ou indirectes, doivent être suivies. Si une nouvelle dépendance fait son apparition, alors elle devra être sauvegardée afin de pouvoir propager dans un futur proche, d'éventuelles mises à jour de valeurs<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-7" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Propagations_automatiques_du_changement">Propagations automatiques du changement</h4></div>
<p>Lorsqu'une variable subit une mise à jour, toutes les autres variables qui en dépendent doivent être informées afin qu'elles puissent se mettre à jour.
</p><p>La propagation doit se poursuivre automatiquement jusqu'à ce que toutes les variables qui en dépendent directement ou indirectement soient à jour<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-8" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Langages_de_programmation_réactifs"><span id="Langages_de_programmation_r.C3.A9actifs"></span>Langages de programmation réactifs</h3></div>
<p>Les langages de programmation réactive entrent dans la catégorie des langages orientés flots de contrôle<sup id="cite_ref-Frederic_Dabrowski11_7-0" class="reference"><a href="#cite_note-Frederic_Dabrowski11-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>.
</p>
<ul><li>RxJava<sup id="cite_ref-:0_8-0" class="reference"><a href="#cite_note-:0-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup></li>
<li>RxJS<sup id="cite_ref-:0_8-1" class="reference"><a href="#cite_note-:0-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup></li>
<li>Rx.Net<sup id="cite_ref-:0_8-2" class="reference"><a href="#cite_note-:0-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup></li>
<li>RxScala<sup id="cite_ref-:0_8-3" class="reference"><a href="#cite_note-:0-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup></li>
<li>RxClojure<sup id="cite_ref-:0_8-4" class="reference"><a href="#cite_note-:0-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup></li>
<li>RxSwift<sup id="cite_ref-:0_8-5" class="reference"><a href="#cite_note-:0-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Apports_et_limitations">Apports et limitations</h3></div>
<div class="mw-heading mw-heading4"><h4 id="Apports">Apports</h4></div>
<ul><li>Il n'est plus possible d'avoir des <a href="Bug_informatique" class="mw-redirect" title="Bug informatique">bugs</a> à cause d'un oubli de mise à jour d'une valeur<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-9" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.</li>
<li>Gain de temps à l'exécution<sup id="cite_ref-Guido_SalvaneschiMira_Mezini20131_3-2" class="reference"><a href="#cite_note-Guido_SalvaneschiMira_Mezini20131-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>.</li>
<li>Certaines applications sont plus simples à écrire en programmation réactive<sup id="cite_ref-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX32_9-0" class="reference"><a href="#cite_note-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX32-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>.</li>
<li>Le programmeur n'a plus à se soucier de l'ordre de déclenchement des événements<sup id="cite_ref-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX2_10-0" class="reference"><a href="#cite_note-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX2-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>.</li></ul>
<div class="mw-heading mw-heading4"><h4 id="Limitations">Limitations</h4></div>
<ul><li>La programmation réactive est difficile à implémenter<sup id="cite_ref-Guido_SalvaneschiMira_Mezini20131_3-3" class="reference"><a href="#cite_note-Guido_SalvaneschiMira_Mezini20131-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>.</li>
<li>La programmation réactive est asynchrone, donc, il est difficile de comprendre et de suivre les flux<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-10" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.</li>
<li>Difficile de coder un compilateur.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Approches">Approches</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Observateur_(patron_de_conception)"><span id="Observateur_.28patron_de_conception.29"></span>Observateur (patron de conception)</h3></div>
<p>L’approche traditionnelle pour implémenter des applications réactives est le patron de conception <a href="Observateur_(patron_de_conception)" title="Observateur (patron de conception)">observateur</a> qui sépare les producteurs d’événements (observables) des consommateurs d’événements (observateurs)<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-11" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Programmation_orientée_objet"><span id="Programmation_orient.C3.A9e_objet"></span>Programmation orientée objet</h3></div>
<p>Il s'agit ici, à la fois d'utiliser de la programmation réactive et de la <a href="Programmation_orient%C3%A9e_objet" title="Programmation orientée objet">programmation orientée objet</a>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Méthodes_et_attributs"><span id="M.C3.A9thodes_et_attributs"></span>Méthodes et attributs</h4></div>
<p>L'approche qui semble la plus naturelle est de remplacer pour chaque objet les méthodes et les attributs par des réactions. Ainsi, les attributs se mettront tout seuls à jour.
</p><p>Par exemple, il est possible de faire un mutateur qui ne prend aucune valeur en paramètre et qui met à jour un attribut.
</p>
<div class="mw-heading mw-heading4"><h4 id="À_la_demande"><span id=".C3.80_la_demande"></span>À la demande</h4></div>
<p>Le principe de cette approche est de faire en sorte de ne mettre à jour les valeurs qu'au moment où on les demande. Seules les entrées sont sauvegardées en mémoire et les sorties sont recalculées à chaque appel<sup id="cite_ref-Guido_SalvaneschiMira_Mezini20133_11-0" class="reference"><a href="#cite_note-Guido_SalvaneschiMira_Mezini20133-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Cache_avec_invalidation">Cache avec invalidation</h4></div>
<p>Recalculer les sorties à chaque fois qu'on les demande est trop inefficace, surtout lorsqu'on travaille avec de grosses données ou si les calculs sont coûteux. Le but de cette approche est d'utiliser une sorte de cache qui permet d'éviter de recalculer inutilement certaines valeurs. Par conséquent, dès qu'on modifie une donnée alors on invalide de manière que dès qu'on demandera la valeur, on sera obligé de recalculer. S'il n'y a eu aucune invalidation, alors on retourne la donnée du cache<sup id="cite_ref-Guido_SalvaneschiMira_Mezini20134_12-0" class="reference"><a href="#cite_note-Guido_SalvaneschiMira_Mezini20134-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Suivre_les_dépendances"><span id="Suivre_les_d.C3.A9pendances"></span>Suivre les dépendances</h4></div>
<p>Il y a ici, deux approches différentes :
</p>
<ul><li>On peut suivre les dépendances et utiliser l'approche à la demande en même temps : Dès qu'on demande une valeur, on va remonter dans les dépendances pour calculer et retourner la bonne valeur<sup id="cite_ref-Guido_SalvaneschiMira_Mezini20135_13-0" class="reference"><a href="#cite_note-Guido_SalvaneschiMira_Mezini20135-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup>.</li>
<li>On peut suivre les dépendances et utiliser l'approche du cache : Dès qu'on demande une valeur, on la retourne. Si on modifie une valeur, on fait en sorte que tout soit à jour en utilisant les dépendances pour minimiser les mises à jour<sup id="cite_ref-Guido_SalvaneschiMira_Mezini20135_13-1" class="reference"><a href="#cite_note-Guido_SalvaneschiMira_Mezini20135-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup>.</li></ul>
<div class="mw-heading mw-heading4"><h4 id="Mises_à_jour_incrémentales"><span id="Mises_.C3.A0_jour_incr.C3.A9mentales"></span>Mises à jour incrémentales</h4></div>
<p>Pour des grosses <a href="Structure_de_donn%C3%A9es" title="Structure de données">structures de données</a>, ou des données assez importantes, le fait d'écraser entièrement les données pour les mettre à jour est trop coûteux.
</p><p>Au lieu de tout recalculer, cette approche consiste à bien cibler les données à mettre à jour pour ne se contenter de ne calculer à nouveau que ce qui a changé réellement<sup id="cite_ref-Guido_SalvaneschiMira_Mezini20136_14-0" class="reference"><a href="#cite_note-Guido_SalvaneschiMira_Mezini20136-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Accumulation_des_changements">Accumulation des changements</h4></div>
<p>Cette approche consiste à sauvegarder toutes les mises à jour (tous les changements de valeur) et d'attendre la demande d'une valeur pour appliquer toutes les mises à jour d'un coup associée à cette valeur<sup id="cite_ref-Guido_SalvaneschiMira_Mezini20137_15-0" class="reference"><a href="#cite_note-Guido_SalvaneschiMira_Mezini20137-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Programmation_réactive_fonctionnelle"><span id="Programmation_r.C3.A9active_fonctionnelle"></span>Programmation réactive fonctionnelle</h3></div>
<p>La programmation réactive fonctionnelle est une approche de la programmation réactive<sup id="cite_ref-Alan_Jeffrey20131_16-0" class="reference"><a href="#cite_note-Alan_Jeffrey20131-16"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Exemples_d'utilisation"><span id="Exemples_d.27utilisation"></span>Exemples d'utilisation</h2></div>
<ul><li>Les tableurs utilisent notamment ce <a href="Style_de_programmation" title="Style de programmation">style de programmation</a> pour garder la cohérence des cellules. Ainsi une cellule contenant "= A1 + 10" sera automatiquement recalculée si A1 est modifiée.</li>
<li>Ce paradigme est aussi utile dans le cadre d'une architecture <a href="Mod%C3%A8le-vue-contr%C3%B4leur" title="Modèle-vue-contrôleur">MVC</a> pour mettre la vue à jour lorsque le modèle est modifié (ou inversement)<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-12" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.</li>
<li>Il est également utilisé dans des applications temps-réel, par exemple avec le <a href="Framework" title="Framework">framework</a> Meteor<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20152_17-0" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20152-17"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup>.</li>
<li>La programmation réactive est aussi utilisée dans les <a href="Interface_graphique" title="Interface graphique">interfaces graphiques</a>, pour mettre à jour les coordonnées de la souris en temps réel<sup id="cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151_1-13" class="reference"><a href="#cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>.</li>
<li>Peut être utilisé pour des <a href="Application_web" title="Application web">applications web</a>, c'est-à-dire, pour répondre à des signaux provenant du réseau<sup id="cite_ref-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX30_18-0" class="reference"><a href="#cite_note-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX30-18"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup>.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Bibliographie">Bibliographie</h2></div>
<ul><li><span class="ouvrage" id="SalvaneschiMargaraTamburrelli2015"><span class="ouvrage" id="Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli2015"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Guido Salvaneschi, Alessandro Margara et Giordano Tamburrelli, <cite class="italique" lang="en">Reactive Programming: a Walkthrough</cite>, <time>2015</time>, 2 <abbr class="abbr" title="pages">p.</abbr><span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Reactive+Programming%3A+a+Walkthrough&rft.aulast=Salvaneschi&rft.aufirst=Guido&rft.au=Alessandro+Margara&rft.au=Giordano+Tamburrelli&rft.date=2015&rft.tpages=2&rfr_id=info%3Asid%2Ffr.wikipedia.org%3AProgrammation+r%C3%A9active"></span></span></span></li>
<li><span class="ouvrage" id="SalvaneschiMezini2013"><span class="ouvrage" id="Guido_SalvaneschiMira_Mezini2013"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Guido Salvaneschi et Mira Mezini, <cite class="italique" lang="en">Towards Reactive Programming for Object-oriented</cite>, <time>2013</time>, 36 <abbr class="abbr" title="pages">p.</abbr><span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Towards+Reactive+Programming+for+Object-oriented&rft.aulast=Salvaneschi&rft.aufirst=Guido&rft.au=Mira+Mezini&rft.date=2013&rft.tpages=36&rfr_id=info%3Asid%2Ffr.wikipedia.org%3AProgrammation+r%C3%A9active"></span></span></span></li>
<li><span class="ouvrage" id="MaierOdersky"><span class="ouvrage" id="Ingo_MaierMartin_Odersky"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Ingo Maier et Martin Odersky, <cite class="italique" lang="en">Deprecating the Observer Pattern with Scala.React</cite>, 20 <abbr class="abbr" title="pages">p.</abbr><span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Deprecating+the+Observer+Pattern+with+Scala.React&rft.aulast=Maier&rft.aufirst=Ingo&rft.au=Martin+Odersky&rft.tpages=20&rfr_id=info%3Asid%2Ffr.wikipedia.org%3AProgrammation+r%C3%A9active"></span></span></span></li>
<li><span class="ouvrage" id="Dabrowski"><span class="ouvrage" id="Frederic_Dabrowski">Frederic Dabrowski, <cite class="italique">Programmation Réactive Synchrone, Langage et Contrôle des Ressources</cite>, 119 <abbr class="abbr" title="pages">p.</abbr><span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Programmation+R%C3%A9active+Synchrone%2C+Langage+et+Contr%C3%B4le+des+Ressources&rft.aulast=Dabrowski&rft.aufirst=Frederic&rft.tpages=119&rfr_id=info%3Asid%2Ffr.wikipedia.org%3AProgrammation+r%C3%A9active"></span></span></span></li>
<li><span class="ouvrage" id="BAINOMUGISHALOMBIDE_CARRETONVAN_CUTSEMMOSTINCKX"><span class="ouvrage" id="ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> ENGINEER BAINOMUGISHA, ANDONI LOMBIDE CARRETON, TOM VAN CUTSEM, STIJN MOSTINCKX et WOLFGANG DE MEUTER, <cite class="italique" lang="en">A Survey on Reactive Programming</cite>, 35 <abbr class="abbr" title="pages">p.</abbr><span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=A+Survey+on+Reactive+Programming&rft.aulast=BAINOMUGISHA&rft.aufirst=ENGINEER&rft.au=ANDONI+LOMBIDE+CARRETON&rft.au=TOM+VAN+CUTSEM&rft.au=STIJN+MOSTINCKX&rft.au=WOLFGANG+DE+MEUTER&rft.tpages=35&rfr_id=info%3Asid%2Ffr.wikipedia.org%3AProgrammation+r%C3%A9active"></span></span></span></li>
<li><span class="ouvrage" id="MaierRompfOdersky"><span class="ouvrage" id="Ingo_MaierTiark_RompfMartin_Odersky"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Ingo Maier, Tiark Rompf et Martin Odersky, <cite class="italique" lang="en">Deprecating the Observer Pattern</cite>, 18 <abbr class="abbr" title="pages">p.</abbr><span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Deprecating++the++Observer++Pattern&rft.aulast=Maier&rft.aufirst=Ingo&rft.au=Tiark+Rompf&rft.au=Martin+Odersky&rft.tpages=18&rfr_id=info%3Asid%2Ffr.wikipedia.org%3AProgrammation+r%C3%A9active"></span></span></span></li>
<li><span class="ouvrage" id="Jeffrey2013"><span class="ouvrage" id="Alan_Jeffrey2013"><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Alan Jeffrey, <cite class="italique" lang="en">Functional Reactive Programming with Liveness Guarantees</cite>, <time>2013</time>, 11 <abbr class="abbr" title="pages">p.</abbr><span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=book&rft.btitle=Functional+Reactive+Programming+with+Liveness+Guarantees&rft.aulast=Jeffrey&rft.aufirst=Alan&rft.date=2013&rft.tpages=11&rfr_id=info%3Asid%2Ffr.wikipedia.org%3AProgrammation+r%C3%A9active"></span></span></span></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Liens_externes">Liens externes</h2></div>
<p><span class="ouvrage" id="BonérFarleyKuhnThompson2014"><span class="ouvrage" id="Jonas_BonérDave_FarleyRoland_KuhnMartin_Thompson2014">Jonas Bonér, Dave Farley, Roland Kuhn et Martin Thompson, « <a rel="nofollow" class="external text" href="http://www.reactivemanifesto.org/fr"><cite style="font-style:normal;">Le Manifeste Réactif</cite></a> », <time class="nowrap" datetime="2014-09-16" data-sort-value="2014-09-16">16 septembre 2014</time> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2015-12-06" data-sort-value="2015-12-06">6 décembre 2015</time>)</small></span></span>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Références"><span id="R.C3.A9f.C3.A9rences"></span>Références</h2></div>
<div class="references-small decimal" style="column-width:25em; column-count:2;"><ol class="references">
<li id="cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20151-1"><span class="reference-text"><a href="#Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli2015">Guido Salvaneschi, Alessandro Margara et Giordano Tamburrelli 2015</a>, <abbr class="abbr" title="page(s)">p.</abbr> 1. </span>
</li>
<li id="cite_note-Ingo_MaierMartin_Odersky1-2"><span class="reference-text"><a href="#Ingo_MaierMartin_Odersky">Ingo Maier Martin Odersky</a>, <abbr class="abbr" title="page(s)">p.</abbr> 1. </span>
</li>
<li id="cite_note-Guido_SalvaneschiMira_Mezini20131-3"><span class="reference-text"><a href="#Guido_SalvaneschiMira_Mezini2013">Guido Salvaneschi et Mira Mezini 2013</a>, <abbr class="abbr" title="page(s)">p.</abbr> 1. </span>
</li>
<li id="cite_note-Ingo_MaierTiark_RompfMartin_Odersky2-4"><span class="reference-text"><a href="#Ingo_MaierTiark_RompfMartin_Odersky">Ingo Maier et Tiark Rompf Martin Odersky</a>, <abbr class="abbr" title="page(s)">p.</abbr> 2. </span>
</li>
<li id="cite_note-Ingo_MaierMartin_Odersky2-5"><span class="reference-text"><a href="#Ingo_MaierMartin_Odersky">Ingo Maier Martin Odersky</a>, <abbr class="abbr" title="page(s)">p.</abbr> 2. </span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a> </span><span class="reference-text"><span class="ouvrage">« <a rel="nofollow" class="external text" href="http://www.reactivemanifesto.org/fr"><cite style="font-style:normal;">Le Manifeste Réactif</cite></a> », sur <span class="italique">reactivemanifesto.org</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2023-04-20" data-sort-value="2023-04-20">20 avril 2023</time>)</small></span>.</span>
</li>
<li id="cite_note-Frederic_Dabrowski11-7"><span class="mw-cite-backlink"><a href="#cite_ref-Frederic_Dabrowski11_7-0">↑</a> </span><span class="reference-text"><a href="#Frederic_Dabrowski">Frederic Dabrowski</a>, <abbr class="abbr" title="page(s)">p.</abbr> 11. </span>
</li>
<li id="cite_note-:0-8"><span class="reference-text"><span class="ouvrage">« <a rel="nofollow" class="external text" href="http://reactivex.io/"><cite style="font-style:normal;">ReactiveX</cite></a> », sur <span class="italique">reactivex.io</span> <small style="line-height:1em;">(consulté le <time class="nowrap" datetime="2020-06-18" data-sort-value="2020-06-18">18 juin 2020</time>)</small></span></span>
</li>
<li id="cite_note-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX32-9"><span class="mw-cite-backlink"><a href="#cite_ref-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX32_9-0">↑</a> </span><span class="reference-text"><a href="#ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX">ENGINEER BAINOMUGISHA, ANDONI LOMBIDE CARRETON et TOM VAN CUTSEM STIJN MOSTINCKX</a>, <abbr class="abbr" title="page(s)">p.</abbr> 32. </span>
</li>
<li id="cite_note-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX2-10"><span class="mw-cite-backlink"><a href="#cite_ref-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX2_10-0">↑</a> </span><span class="reference-text"><a href="#ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX">ENGINEER BAINOMUGISHA, ANDONI LOMBIDE CARRETON et TOM VAN CUTSEM STIJN MOSTINCKX</a>, <abbr class="abbr" title="page(s)">p.</abbr> 2. </span>
</li>
<li id="cite_note-Guido_SalvaneschiMira_Mezini20133-11"><span class="mw-cite-backlink"><a href="#cite_ref-Guido_SalvaneschiMira_Mezini20133_11-0">↑</a> </span><span class="reference-text"><a href="#Guido_SalvaneschiMira_Mezini2013">Guido Salvaneschi et Mira Mezini 2013</a>, <abbr class="abbr" title="page(s)">p.</abbr> 3. </span>
</li>
<li id="cite_note-Guido_SalvaneschiMira_Mezini20134-12"><span class="mw-cite-backlink"><a href="#cite_ref-Guido_SalvaneschiMira_Mezini20134_12-0">↑</a> </span><span class="reference-text"><a href="#Guido_SalvaneschiMira_Mezini2013">Guido Salvaneschi et Mira Mezini 2013</a>, <abbr class="abbr" title="page(s)">p.</abbr> 4. </span>
</li>
<li id="cite_note-Guido_SalvaneschiMira_Mezini20135-13"><span class="reference-text"><a href="#Guido_SalvaneschiMira_Mezini2013">Guido Salvaneschi et Mira Mezini 2013</a>, <abbr class="abbr" title="page(s)">p.</abbr> 5. </span>
</li>
<li id="cite_note-Guido_SalvaneschiMira_Mezini20136-14"><span class="mw-cite-backlink"><a href="#cite_ref-Guido_SalvaneschiMira_Mezini20136_14-0">↑</a> </span><span class="reference-text"><a href="#Guido_SalvaneschiMira_Mezini2013">Guido Salvaneschi et Mira Mezini 2013</a>, <abbr class="abbr" title="page(s)">p.</abbr> 6. </span>
</li>
<li id="cite_note-Guido_SalvaneschiMira_Mezini20137-15"><span class="mw-cite-backlink"><a href="#cite_ref-Guido_SalvaneschiMira_Mezini20137_15-0">↑</a> </span><span class="reference-text"><a href="#Guido_SalvaneschiMira_Mezini2013">Guido Salvaneschi et Mira Mezini 2013</a>, <abbr class="abbr" title="page(s)">p.</abbr> 7. </span>
</li>
<li id="cite_note-Alan_Jeffrey20131-16"><span class="mw-cite-backlink"><a href="#cite_ref-Alan_Jeffrey20131_16-0">↑</a> </span><span class="reference-text"><a href="#Alan_Jeffrey2013">Alan Jeffrey 2013</a>, <abbr class="abbr" title="page(s)">p.</abbr> 1. </span>
</li>
<li id="cite_note-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20152-17"><span class="mw-cite-backlink"><a href="#cite_ref-Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli20152_17-0">↑</a> </span><span class="reference-text"><a href="#Guido_SalvaneschiAlessandro_MargaraGiordano_Tamburrelli2015">Guido Salvaneschi, Alessandro Margara et Giordano Tamburrelli 2015</a>, <abbr class="abbr" title="page(s)">p.</abbr> 2. </span>
</li>
<li id="cite_note-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX30-18"><span class="mw-cite-backlink"><a href="#cite_ref-ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX30_18-0">↑</a> </span><span class="reference-text"><a href="#ENGINEER_BAINOMUGISHAANDONI_LOMBIDE_CARRETONTOM_VAN_CUTSEMSTIJN_MOSTINCKX">ENGINEER BAINOMUGISHA, ANDONI LOMBIDE CARRETON et TOM VAN CUTSEM STIJN MOSTINCKX</a>, <abbr class="abbr" title="page(s)">p.</abbr> 30. </span>
</li>
</ol>
</div>
<div class="navbox-container" style="clear:both;">
</div>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de la programmation informatique</span> </span></li> <li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer skin-invert-image" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de l'informatique théorique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2024-12-19" href="https://fr.wikipedia.org/wiki/?title=Programmation_r%C3%A9active&oldid=221292039">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>